﻿/***************************************************************
 * Name:      http_worker.h
 * Purpose:   HTTP工作线程类定义
 * Author:    杨卓荦 (yzl@bang5.net)
 * Created:   2010-08-29
 * Copyright: 杨卓荦 (http://www.bang5.net)
 * License:
 **************************************************************/

#ifndef CLOUDOWN_HTTP_WORKER_H_
#define CLOUDOWN_HTTP_WORKER_H_
#include "http_base.h"
#include <wx/thread.h>
class HttpWorker : public HttpBase, public wxThread {
public:
  // 构造函数
  HttpWorker(
    const std::string& url,
    const int retry,
    const int retrywait,
    const long long int from,
    const long long int file_size,
    const std::string& refer,
    const std::string& local_file_name);
  // 析构函数
  virtual ~HttpWorker();
  void* Entry();
  // 获得已经接收的字节数
  long long int GetTotalByte() { return total_byte_; }
protected:
private:
  // 将套接字的流指针移动文件内容的位置，跳过HTTP头
  // file_name：服务器端文件名，pos：开始位置，referer：引用页
  bool MoveToFileContent(const char* file_name,
               const long long int pos,
               const char* referer);
  // 得到数据：start_pos：开始位置
  int GetData(long long int start_pos);
  // 得到HTTP头
  bool GetHead();
  bool Retry();
  // 写入文件，返回写入字节数
  int WriteData(const long long int offset,
                const unsigned int len,
                const char *buf);
  std::string url_;
  std::string local_file_name_;  // 本地文件名
  std::string server_;  // 服务器名，程序生成
  std::string host_;  // 主机名，程序生成
  std::string file_;  // 文件名，程序生成
  std::string referer_;  // 引用页，程序生成
  int port_;  // 端口号
  int retry_;  // 最大重复次数
  int retry_wait_;  // 重复等待秒数
  long long int file_size_;  // 文件大小
  long long int from_;  // 从哪个位置开始
  long long int total_byte_;  // 接收的字节数
  static wxCriticalSection file_section_;
};
#endif  // CLOUDOWN_HTTP_WORKER_H_

